package main

import (
	"fmt"
	"io"
	"os"
	"strconv"
)

func main() {
	//传输的文件
	srcFile := "/Users/dean/GoWorks/src/gomod/lessonGoIO/aaa/王定勇_Java后端开发.png"
	//传输目的地
	destFile := "/Users/dean/GoWorks/src/gomod/lessonGoIO/xk-seek3.png"
	//临时记录文件
	tempFile := "/Users/dean/GoWorks/src/gomod/lessonGoIO/xk-temp.txt"
	//与文件创建连接
	file1, _ := os.Open(srcFile)
	file2, _ := os.OpenFile(destFile, os.O_CREATE|os.O_RDWR, os.ModePerm)
	file3, _ := os.OpenFile(tempFile, os.O_CREATE|os.O_RDWR, os.ModePerm)
	defer file1.Close()
	defer file2.Close()

	//1、读取临时文件记录的位置
	file3.Seek(0, io.SeekStart)     //找到光标
	buf := make([]byte, 1024, 1024) //创建一个缓冲区间
	n, _ := file3.Read(buf)         //n为读到的个数
	countStr := string(buf[:n])
	fmt.Println("countStr：", countStr) //输出之前临时文件中存入的数据

	//ParseInt(字符串，进制数，类型)   将上面存储的string转换为int类型
	count, _ := strconv.ParseInt(countStr, 10, 64)
	//seek  找到光标位置
	file1.Seek(count, io.SeekStart)
	file2.Seek(count, io.SeekStart)

	bufData := make([]byte, 1024, 1024)
	total := int(count) //记录所有读到的count

	for {
		readnum, err := file1.Read(bufData) //readnum是读到的数据
		if err == io.EOF {
			fmt.Println("数据读取完毕")
			file3.Close()
			os.Remove(tempFile)
			break
		}
		writeNum, err := file2.Write(bufData[:readnum])
		total = total + writeNum //total是还需要写的数据

		//将文件的进度存储到临时文件当中
		file3.Seek(0, io.SeekStart)            //找到临时文件的光标位置
		file3.WriteString(strconv.Itoa(total)) //将之前存储的int类型的总字符数写出来
	}

	//模仿程序异常
	if total > 6000 {
		panic("断电")
	}

}
